package kr.pe.johnkim.sendme.activity;

import java.util.ArrayList;

import kr.pe.johnkim.sendme.provider.SendMeBlock;
import kr.pe.johnkim.sendme.provider.SendMeDownloadMessageAdapter;
import kr.pe.johnkim.sendme.provider.SendMeFriend;
import kr.pe.johnkim.sendme.provider.SendMeInstall;
import kr.pe.johnkim.sendme.provider.SendMeLog;
import kr.pe.johnkim.sendme.provider.SendMeReceiveMessageAdapter;
import kr.pe.johnkim.sendme.provider.SendMeVoice;
import kr.pe.johnkim.sendme.rest.SendMeAudioMessageRest;
import kr.pe.johnkim.sendme.rest.SendMeBlockRest;
import kr.pe.johnkim.sendme.rest.SendMeLogRest;
import kr.pe.johnkim.sendme.util.SendMeActivityManager;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import kr.pe.johnkim.sendme.util.SendMeConstant;
import kr.pe.johnkim.sendme.util.SendMeDBManagerInstallUser;
import kr.pe.johnkim.sendme.util.SwipeListViewActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;

/**
 * 받은 음성 메시지 목록 액티비티 클래스이다.
 *  목록이 나오고 이름으로 보낸 사람 전화번호 (또는 이름)
 *   우측에 버튼이 3개 (재생, 답장, 차단) 이 있다.
 *   재생시 비번 입력 필요. 
 *   재생 화면 및 목록화면에서 사용자 차단시 확인 후 차단 메소드 호출한다.
 *     이후 차단 목록에서 조회, 차단 해제 가능하다.
 *   재생 화면에서는 재생 외에, 답장, 담기, 삭제 버튼이 있다.
 *     답장은 녹음 화면으로 이동..?
 *     담기는 로컬에 저장(임시 저장과 유사한 기능)
 *     삭제는 확인창 띄운 후 서버에서 삭제하도록 메소드 호출한다.
 *  
 *  [갤럭시 S3 에서 Out Of Memory 오류가 발생하여 확인해본 결과 갤럭시 S3 는 hdpi 의 이미지가 아닌 xhdpi 의 이미지를 사용한다고 하여 hdpi의 이미지들을 xhdpi 로 복사함]
 *   
 *    // 이름대신 닉네임을 사용. 미설정시 "미상"
 *    
 * @author blue
 *
 */
public class SendMeReceiveVoiceListActivity extends SwipeListViewActivity implements OnScrollListener {

	public static String TAG = SendMeReceiveVoiceListActivity.class.getSimpleName();

	public static Activity sendMeReceiveVoiceListActivityForUpdate;
	
	
	
	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();

	// 마스터 암호.
	private String MASTER_PASSWORD = "";

	// 퍼블릭 암호.
	private String PUBLIC_PASSWORD = "";

	// 기능 모드.(MASTER/PUBLIC)
	private String FUNCTION_MODE = "";

	// 사용자 휴대 전화번호.
	private String PHONE_NUMBER = "";

	// 리스트에서 클릭한 버튼이 위치한 포지션
//	int selectedPosition;
	SendMeVoice selectedItem;

	ListView listViewReceiveMessage;
	
	ImageButton imageButtonTopBack;
	ImageButton imageButtonTopMainMenu;

	// 프로그래스바(로딩 표시)
	private ProgressDialog dialog;
	

	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 앱을 종료 한다.
	private static final int ALERT_DIALOG_EXIT_ID = 101;

	// 서버에서 받은 메시지 목록을 조회한다
//	private static final int THREAD_SELECT_RECEIVE_MESSAGE_LIST = 102;		
	private static final int THREAD_SELECT_RECEIVE_MESSAGE_LIST_NO_DIALOG = 302;		

	// 조회한 리스트를 화면에 세팅한다
	private static final int THREAD_SHOW_RECEIVE_MESSAGE_LIST = 103;

	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 105;

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 106;

	// 사용자를 차단할지 확인 받는다
	private static final int THREAD_CONFIRM_BLOCK_USER = 107;
	// 사용자를 차단한다
	private static final int THREAD_BLOCK_USER = 108;
	
	// 토스트 - 이미 차단하였습니다.		
	private static final int THREAD_TOAST_ALREADY_BLOCK = 111;
	// 토스트 - 차단하였습니다.
	private static final int THREAD_TOAST_BLOCK_SUCCESS = 112;
	// 토스트 - 차단 요청이 실패하였습니다.
	private static final int THREAD_TOAST_BLOCK_FAIL = 113;
	
	// 삭제 전 확인 창을 띄운다
	private static final int THREAD_CONFIRM_DELETE = 126;		
	
	// 삭제 성공 토스트를 띄운다
	private static final int THREAD_TOAST_RECEIVE_DELETE_SUCCESS = 116;			
	
	// 삭제 실패 토스트를 띄운다
	private static final int THREAD_TOAST_RECEIVE_DELETE_FAIL = 118;		
	
	// 사용자 확인 창을 띄운다
	private static final int ALERT_SHOW_MESSAGE = 125;
	
	// 녹음 화면 호출
	private static final int RECORDING_SCREEN_CALL = 135;
	
	// 예약 화면에서 메뉴를 콜함. 이 액티비티도 종료해야함
	private static final int RESULT_MAIN_MENU_CALLED = 600;	
	
	
	
	
	// 음성 메시지 어댑터 클래스.
	private SendMeReceiveMessageAdapter sendMeReceiveMessageAdapter;		

	// 메시지 목록
	private ArrayList<SendMeVoice> receiveMessageList = null;		
	public ArrayList<SendMeVoice> receiveMessageListFiltered = null;		

	// 리스트 없음 표시
	View emptyListView;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);

		setContentView(R.layout.activity_send_me_receive_message_list);

		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_03);

		sendMeReceiveVoiceListActivityForUpdate = SendMeReceiveVoiceListActivity.this;
		
		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);

		// 설정파일을 가져 온다.
		this.confirmNotification();

		listViewReceiveMessage = (ListView) findViewById(R.id.listViewReceiveMessage);

		// 뒤로 가기 화살표 버튼을 설정 한다.
		imageButtonTopBack = (ImageButton)findViewById(R.id.imageButtonTopBack);
		imageButtonTopBack.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeReceiveVoiceListActivity.this);
				finish();
			}
		});

		// 타이틀바의 메인 메뉴 버튼을 설정 한다.
		imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
		imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "pressed top main menu.");

				// 메인 메뉴 화면을 출력 한다.
				Intent i = new Intent(SendMeReceiveVoiceListActivity.this, SendMeMainMenuActivity.class);
				startActivity(i);
				
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeReceiveVoiceListActivity.this);
				finish();
				
			}
		});

		// 화면 출력을 위한 친구 목록을 생성 한다.
		receiveMessageList = new ArrayList<SendMeVoice>();

		// 친구 어댑터를 생성 한다.
		sendMeReceiveMessageAdapter = new SendMeReceiveMessageAdapter(getApplicationContext(), this, receiveMessageList);

		// 리스트 없음 표시
		emptyListView = findViewById(R.id.emptyListView);
		
		// list view 의 cursor 를 제공하기 위해서 어댑터를 세팅 한다.
		receiveMessageListFiltered = receiveMessageList;		// 미리 복사
		getListView().setAdapter(sendMeReceiveMessageAdapter);

		// 스크롤 이벤트 리스너를 등록 한다.
		getListView().setOnScrollListener(this);

		// list 레이아웃 그리기 캐쉬를 설정 한다.
		getListView().setAlwaysDrawnWithCacheEnabled (true);

		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
		
		
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.send_me_friend, menu);
		return true;
	}

	/**
	 * 필요한 핸들러를 등록해서 사용한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			Bundle b = msg.getData();
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
			case ALERT_DIALOG_EXIT_ID : 
				break;
//				// 메시지 목록을 세팅
//			case THREAD_SELECT_RECEIVE_MESSAGE_LIST : 
//				threadSelectVoiceList();
//				break;
				// 메시지 목록을 세팅. 노 로딩
			case THREAD_SELECT_RECEIVE_MESSAGE_LIST_NO_DIALOG : 
				runOnUiThread(new RunnableSelectVoiceListNoDialog());
				break;
				
				// 메시지 목록을 출력 한다.		
			case THREAD_SHOW_RECEIVE_MESSAGE_LIST : 
				runOnUiThread(showReceiveMessageList);
				break;
				// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				runOnUiThread(showDialog);
				break;
				// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				runOnUiThread(hideDialog);
				break;
				
				// 사용자 차단 확인
			case THREAD_CONFIRM_BLOCK_USER : 
				runOnUiThread(confirmBlockUser);		
				break;
				// 사용자 차단
			case THREAD_BLOCK_USER : 
				threadBlockUser();
				break;
				
				// 토스트 - 이미 차단된 사용자
			case THREAD_TOAST_ALREADY_BLOCK : 
				showToastAlreadyBlockUser();						
				break;
				// 토스트 - 차단 성공
			case THREAD_TOAST_BLOCK_SUCCESS : 
				showToastBlockUserSuccess();
				break;
				// 토스트 - 차단 실패
			case THREAD_TOAST_BLOCK_FAIL : 
				showToastBlockUserFail();
				break;
						
				
				// 음성 메시지를 삭제 성공 토스트를 띄운다					
			case THREAD_TOAST_RECEIVE_DELETE_SUCCESS :		
				showToastAudioDeleteSuccess();
				break;	
				// 음성 메시지를 삭제 실패 토스트를 띄운다
			case THREAD_TOAST_RECEIVE_DELETE_FAIL :
				showToastAudioDeleteFail();
				break;	
				
				// 음성 메시지 삭제전 확인 창을 띄운다		
			case THREAD_CONFIRM_DELETE : 
				runOnUiThread(confirmDeleteAudio);				
				break;
				
				// 사용자 확인 창을 띄운다
			case ALERT_SHOW_MESSAGE:
				new AlertDialog.Builder(returnThis())
				.setTitle("SendMe")							
				.setMessage(b.getString("msg"))
				.setIcon(R.drawable.ic_launcher)		// 경고창.  
				.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
					}})
					.setNegativeButton("", null).show();
				
			}
		}
	};


	/**
	 * 목록을 세팅해서 출력 한다.
	 */
	private Runnable showReceiveMessageList = new Runnable() {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			
			if(receiveMessageList!=null){
				sendMeReceiveMessageAdapter = new SendMeReceiveMessageAdapter(returnThis(), SendMeReceiveVoiceListActivity.this, receiveMessageList);
				receiveMessageListFiltered = receiveMessageList;		// 미리 복사
				getListView().setAdapter(sendMeReceiveMessageAdapter);
			}
			
			if(receiveMessageList.size()>0){
				emptyListView.setVisibility(View.GONE);
			}else{
				emptyListView.setVisibility(View.VISIBLE);
			}

		}
	};
	
	/**
	 * 다이얼로그
	 */
	private Runnable showDialog = new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
				dialog.show();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
	private Runnable hideDialog = new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
				dialog.hide();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
	



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 확인창.
	/**
	 * 차단 전 확인 창을 띄운다
	 * 
	 */
	private Runnable confirmBlockUser = new Runnable() {		
		@Override
		public void run() {

			new AlertDialog.Builder(SendMeReceiveVoiceListActivity.this)
			.setTitle("차단 확인")
			.setMessage("해당 사용자를 차단하시겠습니까?")
			.setNegativeButton("취소", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {

				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_BLOCK_USER));
				}
			}).show();

		}
	};
	/**
	 * 음성 메시지 삭제전 확인 창을 띄운다
	 */
	private Runnable confirmDeleteAudio = new Runnable() {
		@Override
		public void run() {
			// selectedPosition
			
			new AlertDialog.Builder(SendMeReceiveVoiceListActivity.this)
			.setTitle("삭제 확인")
			.setMessage("음성 메시지를 삭제하시겠습니까?")
			.setNegativeButton("취소", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {

				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					threadUpdateDeactivate();
				}
			}).show();
			
		}
	};
	
	
	/**
	 * showResultDialog
	 * 확인 창을 띄운다
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showAlertMessage(final String msg) {
		runOnUiThread(new Runnable() {		 
			@Override
			public void run(){
				Message message = mHandler.obtainMessage(ALERT_SHOW_MESSAGE);				
				Bundle b = new Bundle();
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				mHandler.sendMessage(message);
			}
		});
	}
	
	
	// 토스트
	/**
	 * 이미 차단된 사용자 toast 를 띄운다.
	 */
	public void showToastAlreadyBlockUser() {					
		CharSequence text = "이미 차단된 사용자입니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/**
	 * 사용자를 차단했다는 toast 를 띄운다.
	 */
	public void showToastBlockUserSuccess() {					
		CharSequence text = "해당 사용자를 차단하였습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/**
	 * 차단 요청이 실패했다는 toast 를 띄운다.
	 */
	public void showToastBlockUserFail() {					
		CharSequence text = "차단 요청이 실패하였습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 *  음성 메시지 삭제에 성공했다는 toast 를 띄운다.
	 */
	public void showToastAudioDeleteSuccess() {
		CharSequence text = "음성 메시지가 삭제되었습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/**
	 *  음성 메시지 삭제에 실패했다는 toast 를 띄운다.
	 */
	public void showToastAudioDeleteFail() {
		CharSequence text = "음성 메시지 삭제에 실패하였습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 리스트 슬라이드 기능 관련 

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub

	}

	@Override
	public ListView getListView() {
		return listViewReceiveMessage;
	}

	@Override
	public void getSwipeItem(boolean isRight, int position) {
		// TODO Auto-generated method stub
		//밀면 우측 숨겨진 버튼이 보이도록 하기.
		if(isRight){		// 오른쪽으로 밀면 숨김
			// 바꿀 포지션(원본)
			for(int i=0; i<receiveMessageList.size(); i++){
				// 현재 필터링된 포지션. 같은걸 찾는다
				if(receiveMessageList.get(i).getIdSendMeVoice().equals(receiveMessageListFiltered.get(position).getIdSendMeVoice())){
					// 같은걸 찾아. 실제 위치값을 바꾼다..org.
					receiveMessageList.get(i).setShowDeleteBtnYn(false);	// isShowDeleteBtnYn	setShowDeleteBtnYn						
				}
			}
//			receiveMessageList.get(position).setShowDeleteBtnYn(false);	// isShowDeleteBtnYn	setShowDeleteBtnYn
		}else{				// 왼쪽으로 밀면 생김
			for(int i=0; i<receiveMessageList.size(); i++){
				// 현재 필터링된 포지션. 같은걸 찾는다
				if(receiveMessageList.get(i).getIdSendMeVoice().equals(receiveMessageListFiltered.get(position).getIdSendMeVoice())){
					// 같은걸 찾아. 실제 위치값을 바꾼다..org.
					receiveMessageList.get(i).setShowDeleteBtnYn(true);	// isShowDeleteBtnYn	setShowDeleteBtnYn						
				}
			}
//			receiveMessageList.get(position).setShowDeleteBtnYn(true);
		}
		sendMeReceiveMessageAdapter.notifyDataSetChanged();
	}

	@Override
	public void onItemClickListener(ListAdapter adapter, int position) {
		// TODO Auto-generated method stub
	}


	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	// 리스트에 있는 버튼 클릭시 실행될 메소드

	// 재생 버튼 클릭시 파라미터를 세팅하여 받은 파일 전용 재생 액티비티를 실행시킨다
	public void playAudioMessage(SendMeVoice sendMeVoice){
		
//		// 보안 설정시. 마스터 키를 입력 받고 나서 진행
//		if(FUNCTION_MODE.equals("MASTER")){
//			// 마스터키를 입력 받는다.
//			Intent passwordActivity = new Intent(SendMeReceiveVoiceListActivity.this, SendMePasswordActivity.class);
//			passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_MASTER_KEY_CHECK);
//			startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
//		
//		}else if(FUNCTION_MODE.equals("PUBLIC")){
//			// 퍼블릭키를 입력 받는다.
//			Intent passwordActivity = new Intent(SendMeReceiveVoiceListActivity.this, SendMePasswordActivity.class);
//			passwordActivity.putExtra("ACTION_CODE", ACTION_CODE_PUBLIC_KEY_CHECK);
//			startActivityForResult(passwordActivity, PASSWORD_ACTIVITY_CODE);
//			
//		// 비밀번호 설정이 되어있지 않으면 그냥 사용.	
//		}else{
//			// 메시지 읽음 업데이트
//			if(!receiveReadYn.equals("Y")){
//				Log.d(TAG," ### 1");
//				mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_READ_YN));		
//			}
//			
//			// 음성 메시지 파일 다운로드 --> 끝나고 리스트 받아와서 세팅
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_DOWNLOAD_AUDIO_FILE));
//		}
		
		
		SendMeCommon sendMeCommon = new SendMeCommon();
		
		Intent intent = new Intent(SendMeReceiveVoiceListActivity.this, SendMeAudioPlayForReceiveMessageActivity.class);
//		SendMeVoice sendMeVoice = receiveMessageList.get(position);
//		String senderName = sendMeCommon.selectFriendNameByPhoneNumber(returnThis(), sendMeVoice.getSender());	// 전화번호부를 쓰지 않기로 함
		intent.putExtra("idSendMeVoice", sendMeVoice.getIdSendMeVoice());
		intent.putExtra("sender", sendMeVoice.getSender());
		intent.putExtra("senderName", sendMeVoice.getNickName());		
		intent.putExtra("fileName", sendMeVoice.getFileName());
		intent.putExtra("idSendMeFile", sendMeVoice.getIdSendMeFile());
		intent.putExtra("readYn", sendMeVoice.getReadYn());
		startActivity(intent);
		
		// 화면을 닫는다.
		sendMeActivityManager.removeActivity(SendMeReceiveVoiceListActivity.this);
		finish();
	}

	// 답장 버튼 파라미터를 세팅하여 녹음 액티비티를 실행시킨다
	public void replyAudioMessage(SendMeVoice sendMeVoice){
		Intent intent = new Intent(SendMeReceiveVoiceListActivity.this, SendMeAudioRecordActivity.class);
//		SendMeVoice sendMeVoice = receiveMessageList.get(position);

		SendMeCommon sendMeCommon = new SendMeCommon();
		
		// sender 를 receiver 로 지정하고 receiverList에 담아 해당 전번과 일치하는 이름을 receiverName 로 지정하고 receiverNameList 에 담는다
		String receiver = sendMeVoice.getSender();
		String receiverName = sendMeCommon.selectFriendNameByPhoneNumber(returnThis(),receiver);
		String[] receiverList = sendMeCommon.convertStringToArray(receiver);					//		receiverList = getIntent.getStringArrayExtra("receiverList"); 로 받음
		String[] receiverNameList = sendMeCommon.convertStringToArray(receiverName);			//		receiverNameList = getIntent.getStringArrayExtra("receiverNameList"); 로 받음
		intent.putExtra("receiverList", receiverList);
		intent.putExtra("receiverNameList", receiverNameList);
		startActivityForResult(intent, RECORDING_SCREEN_CALL);
		
	}

	// 차단 버튼 확인창을 띄우고 차단한다
	public void blockUser(SendMeVoice sendMeVoice){
		// 선택된 포지션 저장
		selectedItem = sendMeVoice;
		
		// 확인창
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CONFIRM_BLOCK_USER));
	}

	
	// 삭제 버튼 클릭시 확인을 받고 목록에서 삭제 
	public void confirmDelete(SendMeVoice sendMeVoice){
		selectedItem = sendMeVoice;				
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CONFIRM_DELETE));		// 확인 후 삭제
	}
	
	
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 서버 통신


	/**
	 * 러너블. 메시지 리스트 가져오기(+뱃지 카운트 업데이트)
	 */
	class RunnableSelectVoiceListNoDialog implements Runnable {
		public void run(){
			new backgroundThreadSelectVoiceListNoDialog().execute();	
		}
	}
	/**
	 * 받은 음성 메시지를 가져온다			selectVoiceList
	 *  일반 리스트를 서버로 전송할때는 서버에서 RequestBody 로 받아서 json을 자동으로 object 변환시켜주므로
	 *    jsonArray 에 jsonObject 를 담을때 toString() 처리하여 담아서 보내야 하지만 
	 *  multipart로 파일을 전송하는 경우에는 서버에서 RequestParam 으로 받는데 이때에는 json을 자동으로 object 변환하지 않기 때문에
	 *   jsonArray 에 jsonObject 를 담을때 jsonObject 그대로 넣어야 서버에서 받을때 넣은 json 형태 그대로 꺼내어진다. 
	 */
	public class backgroundThreadSelectVoiceListNoDialog extends AsyncTask<Void, Void, Void>{
		@Override protected void onPreExecute() {  
			// 프로그레스 바를 출력 한다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		} 
		@Override protected void onPostExecute(Void result) {  
			// 프로그레스 바를 감춘다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadSelectVoiceListNoDialog");
			SendMeVoice sendMeVoice = new SendMeVoice();
			sendMeVoice.setReceiver(PHONE_NUMBER);			 
			sendMeVoice.setDeliveryYn("Y");;				
			sendMeVoice.setActivateYn("Y");;			
			
			SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();
			
			// 받은 메시지 목록		receiveMessageList
			ArrayList<SendMeVoice> resultReceiveMessageList = null;		
			
			resultReceiveMessageList = sendMeAudioMessageRest.selectVoiceList(sendMeVoice);		// 원본 (정상 동작)
			
			receiveMessageList = new ArrayList<SendMeVoice>();
			
			int unreadCount = 0;
			
			
			SendMeCommon sendMeCommon = new SendMeCommon();
			
//			ArrayList<SendMeFriend> phoneBookAddress = sendMeCommon.selectPhoneBookAddress(returnThis());
//			SendMeDBManagerInstallUser sendMeDBManagerInstallUser = new SendMeDBManagerInstallUser(returnThis());			
//			ArrayList<SendMeFriend> phoneBookAddress = sendMeDBManagerInstallUser.selectInstallUserData();
			
			if(resultReceiveMessageList!=null){
				for(int i=0; i<resultReceiveMessageList.size(); i++){
					
					SendMeVoice tempSendMeVoice = resultReceiveMessageList.get(i);
					
					if(tempSendMeVoice.getReadYn().equals("N")){
						unreadCount++;
					}
					
					// 닉네임 없을때
					if(tempSendMeVoice.getNickName()==null || tempSendMeVoice.getNickName().length()<1){
						tempSendMeVoice.setNickName("미상");
					}
					
//					// 초기화
//					resultReceiveMessageList.get(i).setSenderName("");
//					
//					// 전화번호부와 동기화하여 이름 세팅
//					for(int j=0; j<phoneBookAddress.size(); j++){
//						
//						// 번호가 같으면 전화번호부의 이름으로 세팅
//						if(tempSendMeVoice.getSender().equals(phoneBookAddress.get(j).getPhoneNumber())){
//							if(phoneBookAddress.get(j).getNickName().length()>0){
//								tempSendMeVoice.setSenderName(phoneBookAddress.get(j).getNickName());
//							}else{
//								// 보낸사람 닉네임 없으면 전번 -> 미상 으로 설정
////								tempSendMeVoice.setSenderName(phoneBookAddress.get(j).getName());
//								tempSendMeVoice.setSenderName("미상");
//							}
////							tempSendMeVoice.setSenderName(phoneBookAddress.get(j).getName());
//						}
//					}
					receiveMessageList.add(tempSendMeVoice);
				}
				
				// pref 에 안읽은 메시지 개수 저장
				sendMeCommon.badgeCountPrefSave(returnThis(), unreadCount); 
			}
			
			// 화면에 출력
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_SHOW_RECEIVE_MESSAGE_LIST));	
			return null; 
		}
	}
	
	
	
	/**
	 * 사용자를 차단한다		
	 *    먼저 중복 확인 호출하고 이후 사용자를 차단하는 메소드를 호출한다
	 *    + 사용자를 차단하면 현재 음성 메시지도 삭제되도록 한다
	 */
	public void threadBlockUser() {
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {
			
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeBlock sendMeBlock = new SendMeBlock();
				
//				SendMeVoice sendMeVoice = receiveMessageList.get(selectedPosition);
				SendMeVoice sendMeVoice = selectedItem;
				// 차단 대상 전화번호 : 보낸 사람
				String blockUserNumber = sendMeVoice.getSender();
				
				sendMeBlock.setPhoneNumber(blockUserNumber);				// 너
				sendMeBlock.setActivateYn("Y");
				sendMeBlock.setSendMeMemberPhoneNumber(PHONE_NUMBER);		// 나
				
				SendMeBlockRest sendMeBlockRest = new SendMeBlockRest();
				SendMeBlock result = sendMeBlockRest.selectDuplicate(sendMeBlock);
				
				// 최초 차단
				if(result.getTotalCount().equals("0")){		

					sendMeBlock = new SendMeBlock();
					
					sendMeBlock.setPhoneNumber(blockUserNumber);
					sendMeBlock.setActivateYn("Y");
					sendMeBlock.setModifyDate(nowTime);
					sendMeBlock.setRegisterDate(nowTime);
					sendMeBlock.setSendMeMemberPhoneNumber(PHONE_NUMBER);
					
					result = sendMeBlockRest.registerBlock(sendMeBlock);
					
					if(result.getResult().equals("SUCCESS")){		
						// "차단하였습니다."
						mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_BLOCK_SUCCESS));
						
						
//						// 1. (삭제 하는 경우) 차단 성공하면 메시지도 삭제한다	// ### 
//						threadUpdateDeactivate();
						// 2. (삭제 하지 않는  경우) 목록 갱신. // 서버 에서 리스트를 조회한다
						mHandler.sendEmptyMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST_NO_DIALOG);
						
					}else{
						// "차단 실패했습니다."
						mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_BLOCK_FAIL));
					}
				// 전에 차단한적 있는 경우	
				}else{
					
					if(result.getActivateYn().equals("Y")){	
						// "이미 차단 하셨어요"		
						mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_ALREADY_BLOCK));
					}else{
						// updateBlock 을 사용해서 차단한다.
						sendMeBlock = new SendMeBlock();
						
						sendMeBlock.setPhoneNumber(blockUserNumber);
						sendMeBlock.setActivateYn("Y");			// 차단. 해제시에는 N으로 업뎃
						sendMeBlock.setModifyDate(nowTime);
						sendMeBlock.setSendMeMemberPhoneNumber(PHONE_NUMBER);
						
						result = sendMeBlockRest.updateBlock(sendMeBlock);
						
						if(result.getResult().equals("SUCCESS")){		
							// "차단하였습니다."
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_BLOCK_SUCCESS));
							
//							// 1. (삭제 하는 경우) 차단 성공하면 메시지도 삭제한다	// ### 
//							threadUpdateDeactivate();
							// 2. (삭제 하지 않는  경우) 목록 갱신. // 서버 에서 리스트를 조회한다
							mHandler.sendEmptyMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST_NO_DIALOG);
							
						}else{
							// "차단 실패했습니다."
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_BLOCK_FAIL));
						}
					}
				}
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			}
		});
		thread.start();
	}
	
	
	/**
	 *  음성 메시지를 삭제한다	
	 *    받은 메시지를 서버에서 삭제한다. 성공시 목록 갱신
	 */
	public void threadUpdateDeactivate() {
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {
			
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();
				
				SendMeVoice sendMeVoice = new SendMeVoice();
//				sendMeVoice.setIdSendMeVoice(receiveMessageList.get(selectedPosition).getIdSendMeVoice());
				sendMeVoice.setIdSendMeVoice(selectedItem.getIdSendMeVoice());
				sendMeVoice.setActivateYn("N");
				sendMeVoice.setModifyDate(nowTime);
				
				SendMeVoice result = sendMeAudioMessageRest.updateDeactivate(sendMeVoice);
					
				if(result.getResult().equals("SUCCESS")){		
					// "삭제 하였습니다."
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_RECEIVE_DELETE_SUCCESS));
					
					// 목록 갱신. // 서버 에서 리스트를 조회한다
					mHandler.sendEmptyMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST_NO_DIALOG);
				}else{
					// "삭제 실패했습니다."
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_RECEIVE_DELETE_FAIL));
				}
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			}
		});
		thread.start();
	}
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		Bundle extraBundle;
		if( requestCode == RECORDING_SCREEN_CALL ) {
			
			if(resultCode == Activity.RESULT_OK){		// 정상 반환시.
				Log.d(TAG,"RESULT_OK");
				extraBundle = data.getExtras();		// 번들을 반환했으니까 번들을 불러오면 세팅된 값을 가지고 있음.

//				String key1 = extraBundle.getString("key1");	
//				Log.d(TAG,"key1:"+key1);
				
			}else if(resultCode == Activity.RESULT_CANCELED){
				Log.d(TAG,"RESULT_CANCELED");
			}else if(resultCode == RESULT_MAIN_MENU_CALLED){
				Log.d(TAG,"RESULT_MAIN_MENU_CALLED");
				
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeReceiveVoiceListActivity.this);
				finish();
				
			}
		}
	}
	

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	public void onResume(){
		super.onResume();
		
		dialog = ProgressDialog.show(SendMeReceiveVoiceListActivity.this, "", "Load..", true);	 
		dialog.hide();
		
		// 리스트 열림
		savePrefReceiveMessageListOpened();
		
		// 서버 에서 리스트를 조회한다
		mHandler.sendEmptyMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST_NO_DIALOG);
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST));	
	}
	
	
	/*
	 * GCM에서 호출하여 업데이트 용도.
	 */
	public void callSelectMessageList(){
		// 서버 에서 리스트를 조회한다.
		mHandler.sendEmptyMessage(THREAD_SELECT_RECEIVE_MESSAGE_LIST_NO_DIALOG);
	}
	
	
	
	@Override
	public void onStop(){
		super.onStop();
		
		// 리스트 닫힘
		savePrefReceiveMessageListClosed();
		
		dialog.dismiss();
	}
	
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(PHONE_NUMBER);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
	
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	// 컨텍스트 반환
	public Context returnThis() {
		return this;
	}


	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		MASTER_PASSWORD = mSharedPreference.getString("master_password", "");
		PUBLIC_PASSWORD = mSharedPreference.getString("public_password", "");
		FUNCTION_MODE = mSharedPreference.getString("function_mode", "");
		PHONE_NUMBER = mSharedPreference.getString("phone_number", "");
	}
	
	/**
	 * SharedPreference 에 상태를 저장한다 (받은 메시지 리스트 열림)
	 *  푸시 받아서 업데이트 용도
	 */
	public void savePrefReceiveMessageListOpened() {
		// 저장
		SharedPreferences sharedPreferences = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		SharedPreferences.Editor editor = sharedPreferences.edit();
		editor.putBoolean("receive_message_list_open_yn", true);
		editor.commit();
	}
	/**
	 * SharedPreference 에 상태를 저장한다 (받은 메시지 리스트 닫힘)
	 *  푸시 받아서 업데이트 용도
	 */
	public void savePrefReceiveMessageListClosed() {
		// 저장
		SharedPreferences sharedPreferences = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		SharedPreferences.Editor editor = sharedPreferences.edit();
		editor.putBoolean("receive_message_list_open_yn", false);
		editor.commit();
	}
	
	

	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 화면을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		sendMeActivityManager.removeActivity(this);
		finish();
	}

}